package mainBlock

import (
	"gitee.com/wchpub/fnsvr/funcSless"
	"gitee.com/wchpub/xeSvrPub/gameProto"
)

type BlockType string

const (
	//数据块名称
	BlockName string = "main"
)

const (
	//档案版本号
	Key_Ver BlockType = funcSless.GAME_DATA_VERSION_KEY

	//最近一次从抖小侧边栏跳回的时间
	//Key_DyMiniSideBarBackTime BlockType = "dyMiniSideBarBackTime"

	//最近一次领取抖小侧边栏奖励的时间
	//Key_DyMiniSideBarRewardTime BlockType = "dyMiniSideBarRewardTime"

	//抖小桌面快捷方式领奖时间
	//Key_DyMiniDesktopRewardTime BlockType = "dyMiniDesktopRewardTime"

	Key_TotalPassCount BlockType = "totalPassCount" //总通关次数
	Key_TotalGameTimes BlockType = "totalGameTimes" //总游戏次数

	//Key_AdSeed   BlockType = "adSeed"   //广告种子，用于校验合法性
	Key_JoinTime BlockType = "joinTime" //用户加入时间

	//Key_RankingTeam         BlockType = "rankingTeam"         //排行分组，空白表示其它
	//Key_RankingTeamSetTimes BlockType = "rankingTeamSetTimes" //排行分组设置次数

	//头像信息
	Key_Face     BlockType = "face"     //用户头像
	Key_Nickname BlockType = "nickName" //用户昵称
	Key_Gender   BlockType = "gender"   //用户性别

	//当前选中的头像
	//Key_ChooseSkinId  BlockType = "chooseSkinId"
	//Key_ChooseSkinIdx BlockType = "chooseSkinIdx"

	////////////////////////////////////////////////////////////
	//json类型

	Key_Items   BlockType = "items"   //所有道具
	Key_Signin7 BlockType = "signin7" //7日签到数据

	//Key_Skins BlockType = "skins" //皮肤数据
	//Key_CollectedSkin    BlockType = "collectedSkin"    //已收藏的皮肤
	//Key_DailyLevelReward BlockType = "dailyLevelReward" //每日关卡奖励,如果值有效则表示有未领取的奖励
)

// 道具信息
type ItemInfo struct {
	Num            int32 `json:"num"`                      //道具数量 或 懒运算参数的当前值
	LastChangeTime int64 `json:"lastChangeTime,omitempty"` //懒运算参数最近一次增加或减少值的时间,单位毫秒
}

// 7日签到数据,保留空白值，便于日后扩展
type Signin7Info struct {
}

// 玩家拥有的全部道具
type ItemsType map[int32]*ItemInfo

// 7日签到全部数据,key为签到时间戳，单位秒
type Signin7Type map[int64]*Signin7Info

type Data struct {
	super *funcSless.Block[BlockType]
}

// 获取玩家所有道具数据
func (m *Data) Items() (ItemsType, error) {
	re := make(ItemsType)
	err := m.super.GetJson(Key_Items, &re)
	if err != nil {
		return nil, err
	}

	return re, nil
}

// 设置玩家所有道具数据
func (m *Data) SetItems(itemsValue map[int32]*ItemInfo) error {
	return m.super.SetJson(Key_Items, itemsValue)
}

// 获取7日签到数据
func (m *Data) Signin7() (Signin7Type, error) {
	re := make(Signin7Type)
	err := m.super.GetJson(Key_Signin7, &re)
	if err != nil {
		return nil, err
	}

	return re, nil
}

// 设置7日签到数据
func (m *Data) SetSignin7(signin7Value Signin7Type) error {
	return m.super.SetJson(Key_Signin7, signin7Value)
}

/*
// 皮肤
func (m *Data) SetSkins(v []*gameProto.SkinInfo) error {
	return m.super.SetJson(Key_Skins, v)
}

func (m *Data) Skins() ([]*gameProto.SkinInfo, error) {
	re := []*gameProto.SkinInfo{}
	err := m.super.GetJson(Key_Skins, &re)
	if err != nil {
		return nil, err
	}

	return re, nil
}

// 日常关奖励信息
func (m *Data) SetDailyLevelReward(v *gameProto.DailyLevelReward) error {
	return m.super.SetJson(Key_DailyLevelReward, v)
}

func (m *Data) DailyLevelReward() (*gameProto.DailyLevelReward, error) {
	re := gameProto.DailyLevelReward{}
	err := m.super.GetJson(Key_DailyLevelReward, &re)
	if err != nil {
		return nil, err
	}

	return &re, nil
}
*/
/*
// 最近一次从抖小侧边栏跳回的时间
func (m *Data) DyMiniSideBarBackTime() (int64, error) {
	return m.super.GetInt64(Key_DyMiniSideBarBackTime)
}

func (m *Data) SetDyMiniSideBarBackTime(v int64) {
	m.super.SetInt64(Key_DyMiniSideBarBackTime, v)
}
*/
/*
// 最近一次领取抖小侧边栏奖励的时间
func (m *Data) DyMiniSideBarRewardTime() (int64, error) {
	return m.super.GetInt64(Key_DyMiniSideBarRewardTime)
}

func (m *Data) SetDyMiniSideBarRewardTime(v int64) {
	m.super.SetInt64(Key_DyMiniSideBarRewardTime, v)
}

// 最近一次领取抖小桌面奖励的时间
func (m *Data) DyMiniDesktopRewardTime() (int64, error) {
	return m.super.GetInt64(Key_DyMiniDesktopRewardTime)
}

func (m *Data) SetDyMiniDesktopRewardTime(v int64) {
	m.super.SetInt64(Key_DyMiniDesktopRewardTime, v)
}*/

// 总通关次数
func (m *Data) TotalPassCount() (int64, error) {
	return m.super.GetInt64(Key_TotalPassCount)
}

func (m *Data) SetTotalPassCount(v int64) {
	m.super.SetInt64(Key_TotalPassCount, v)
}

/*
// 排行所属队伍
func (m *Data) RankingTeam() (string, error) {
	return m.super.GetString(Key_RankingTeam)
}

func (m *Data) SetRankingTeam(v string) {
	m.super.SetString(Key_RankingTeam, v)
}
*/
// 用户头像
func (m *Data) Face() (int, error) {
	return m.super.GetInt(Key_Face)
}

func (m *Data) SetFace(v int) {
	m.super.SetInt(Key_Face, v)
}

// 用户昵称
func (m *Data) Nickname() (string, error) {
	return m.super.GetString(Key_Nickname)
}

func (m *Data) SetNickname(v string) {
	m.super.SetString(Key_Nickname, v)
}

// 用户性别
func (m *Data) Gender() (gameProto.Gender, error) {
	re, err := m.super.GetInt(Key_Gender)
	if err != nil {
		return gameProto.Gender_UNKNOWN_GENDER, err
	}
	return gameProto.Gender(re), nil
}

func (m *Data) SetGender(v gameProto.Gender) {
	m.super.SetInt(Key_Gender, int(v))
}

/*
// 排行所属队伍设置次数
func (m *Data) RankingTeamSetTimes() (int64, error) {
	return m.super.GetInt64(Key_RankingTeamSetTimes)
}

func (m *Data) SetRankingTeamSetTimes(v int64) {
	m.super.SetInt64(Key_RankingTeamSetTimes, v)
}*/

// 总游戏次数
func (m *Data) TotalGameTimes() (int64, error) {
	return m.super.GetInt64(Key_TotalGameTimes)
}

func (m *Data) SetTotalGameTimes(v int64) {
	m.super.SetInt64(Key_TotalGameTimes, v)
}

/*
// 广告验证种子
func (m *Data) AdSeed() (int, error) {
	return m.super.GetInt(Key_AdSeed)
}

func (m *Data) SetAdSeed(v int) {
	m.super.SetInt(Key_AdSeed, v)
}

// 当前选中的皮肤
func (m *Data) ChooseSkinId() (int, error) {
	return m.super.GetInt(Key_ChooseSkinId)
}

func (m *Data) SetChooseSkinId(v int) {
	m.super.SetInt(Key_ChooseSkinId, v)
}

func (m *Data) ChooseSkinIdx() (int, error) {
	return m.super.GetInt(Key_ChooseSkinIdx)
}

func (m *Data) SetChooseSkinIdx(v int) {
	m.super.SetInt(Key_ChooseSkinIdx, v)
}
*/
// 版本号
func (m *Data) Ver() (int64, error) {
	return m.super.GetInt64(Key_Ver)
}

func (m *Data) SetVer(v int64) {
	m.super.SetInt64(Key_Ver, v)
}

// 用户加入时间
func (m *Data) JoinTime() (int64, error) {
	return m.super.GetInt64(Key_JoinTime)
}

func (m *Data) SetJoinTime(v int64) {
	m.super.SetInt64(Key_JoinTime, v)
}

func (m *Data) PreLoad(keys ...BlockType) {
	m.super.PreLoad(keys...)
}

func (m *Data) GetAll() (map[string]string, error) {
	return m.super.GetAll()
}

func (m *Data) GetString(key BlockType) (string, error) {
	return m.super.GetString(key)
}

// 获取主数据块
func GetBlock(plyData *funcSless.PlayerData) (*Data, error) {

	bk, err := funcSless.GetBlock[BlockType](plyData, BlockName)
	if err != nil {
		return nil, err
	}

	return &Data{
		super: bk,
	}, nil
}
